home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 13, No. 04 (1992-04)(MindCraft Publishing)(Side A).zip / Nibble Volume 13, No. 04 (1992-04)(MindCraft Publishing)(Side A).po / SQUEEZER.S < prev    next >
Text File  |  1996-12-24  |  36KB  |  1,200 lines

  1. *********************************
  2. **                             **
  3. **     APPLESOFT SQUEEZER      ** 
  4. **   by Raymond Groenestein    **
  5. **     Copyright (C) 1992      **
  6. **    MindCraft Publ. Corp.    ** 
  7. **     Lincoln, MA  01773      **
  8. **                             ** 
  9. **     DOS Toolkit/EDASM       ** 
  10. *********************************
  11. *
  12. *
  13. LPTR      EQU $0 
  14. PPTR      EQU $2  
  15. LOC       EQU $3 
  16. NPRG      EQU $4  
  17. FLAG      EQU $7  
  18. COUNT     EQU $8  
  19. DEST      EQU $8
  20. YSTORE    EQU $9  
  21. LSTORE    EQU $18 
  22. CSTORE    EQU $18
  23. HSTORE    EQU $19 
  24. TLN       EQU $1A 
  25. INC       EQU $1C 
  26. LINNUM    EQU $50
  27. REMFLG    EQU $F8
  28. LEN       EQU $F9 
  29. COMFLG    EQU $FA 
  30. IFFLG     EQU $FB 
  31. QFLG      EQU $FC 
  32. PRTFLG    EQU $FC
  33. DATAFLG   EQU $FD
  34. SVSTACK   EQU $FE
  35. *
  36. *
  37.           ORG $6000
  38. *
  39. *
  40. SETUP     LDA $AA59      ;FOR BRUN BUG 
  41.           PHA            ;STORE 
  42.           LDA $74        ;HIMEM 
  43.           CMP #<2*FINISH-START 
  44.           BCS SU1        ;ENOUGH MEMORY? 
  45.           JSR $FD8E      ;CROUT
  46.           LDA #$F1       ;OUT OF MEMORY
  47.           JSR DE1        ;PRINT MSG
  48.           PLA            ;FIX 
  49.           STA $AA59      ;STACK 
  50.           RTS            ;AND LEAVE
  51. SU1       SBC #<FINISH-START+$100 
  52.           STA DEST       ;SAVE 
  53. *
  54. *CHECK FOR PRODOS
  55. *
  56.           LDA $BF00      ;CHECK 
  57.           CMP #$4C       ;PRODOS? 
  58.           BEQ PRODOS     ;YES, GET A BUFFER 
  59. *
  60. *SET UP HIMEM FOR DOS 3.3
  61. *
  62.           LDA #0         ;ITS DOS 
  63.           STA $73        ;SET 
  64.           LDA DEST       ;UP 
  65.           STA $74        ;HIMEM 
  66.           BNE MODIFY     ;ALWAYS
  67. *
  68. *GET BUFFER FROM PRODOS
  69. *
  70. PRODOS    LDA #<FINISH-START+$100 
  71.           JSR $BEF5      ;GETBUFR
  72.           BCC GOTBUF     ;IT WORKED? 
  73.           JMP $BE09      ;ERROUT
  74. GOTBUF    STA DEST       ;ADDRESS IN A-REG  
  75. *
  76. *MODIFY THE CODE
  77. *
  78. MODIFY    LDA #START     ;SET
  79.           STA $6         ;UP 
  80.           LDA #<START    ;POINTERS 
  81.           STA $7         ;AND 
  82. MODLP     LDY #0         ;GET
  83.           LDA ($6),Y     ;BYTE 
  84.           JSR $F88E      ;INSDS2   
  85.           LDY $2F        ;LENGTH 
  86.           CPY #2         ;3 BYTES? 
  87.           BNE NOMOD      ;NO, LEAVE IT 
  88.           SEC            ;FOR SBC
  89.           LDA ($6),Y     ;HIGH BYTE
  90.           SBC #<START    ;TOO 
  91.           BCC NOMOD      ;SMALL? 
  92.           CMP #<FINISH-START+$100
  93.           BCS NOMOD      ;TOO BIG? 
  94.           ADC DEST       ;BYTE 
  95.           STA ($6),Y     ;STORE 
  96. NOMOD     TYA            ;AND 
  97.           SEC            ;MOVE 
  98.           ADC $6         ;POINTERS 
  99.           STA $6         ;TO 
  100.           BCC NOINC      ;NEXT 
  101.           INC $7         ;INSTRUCTION 
  102. NOINC     CMP #HEADING   ;IS 
  103.           LDA $7         ;ALL  
  104.           SBC #<HEADING  ;CODE 
  105.           BCC MODLP      ;DONE? 
  106. *
  107. *SAVE OLD & ADDRESS
  108. *
  109.           LDA $3F6       ;STORE 
  110.           STA OLDAMP+1   ;AFTER 
  111.           LDA $3F7       ;MODIFYING 
  112.           STA OLDAMP+2   ;PROGRAM! 
  113. *
  114. *MOVE TO NEW LOCATION
  115. *
  116.           LDA #START
  117.           STA $3C        ;A1L
  118.           LDA #<START
  119.           STA $3D
  120.           LDA #FINISH
  121.           STA $3E        ;A2L 
  122.           LDA #<FINISH
  123.           STA $3F
  124.           LDA #0
  125.           STA $42        ;A4L
  126.           LDA DEST 
  127.           STA $43 
  128.           LDY #0
  129.           JSR $FE2C      ;MOVE
  130. *
  131. *PRINT A MESSAGE
  132. *
  133.           JSR $FB39      ;SETTXT
  134.           JSR $FC58      ;HOME
  135.           LDA #MSG       ;SYNTAX 
  136.           LDY #<MSG      ;MESSAGE 
  137.           JSR $DB3A      ;STROUT
  138.           LDA #5         ;FIVE LINES 
  139.           STA $22        ;WNDTOP
  140.           LDA #<SETUP    ;DESTROYED 
  141.           CMP $B0        ;BASIC? 
  142.           BGE SU2        ;YES, TELL
  143.           JSR $FE80      ;SETINV
  144.           LDA #RELOAD    ;USER TO 
  145.           LDY #<RELOAD   ;RELOAD 
  146.           JSR $DB3A      ;STROUT
  147.           JSR $FE84      ;SETNORM
  148.           LDA #8         ;MOVE 
  149.           STA $68        ;POINTERS 
  150.           LDA #0         ;BACK 
  151.           TAY            ;TO 
  152.           STA $67        ;USUAL 
  153.           STA ($67),Y    ;SPOT
  154.           INC $67        ;$801 
  155. *
  156. *SET UP NEW & ADDRESS
  157. *
  158. SU2       LDA #$4C       ;JMP 
  159.           STA $3F5       ;AMPER 
  160.           LDA #0
  161.           STA $3F6       ;AMPER 
  162.           LDA DEST 
  163.           STA $3F7       ;AMPER 
  164.           JSR CONJMP
  165.           PLA            ;FIX 
  166.           STA $AA59      ;BUG 
  167.           RTS
  168. *
  169. MSG       ASC 'Applesoft Squeezer by Ray Groenestein' 
  170.           DFB $D         ;NEW LINE 
  171.           ASC 'Copyright (C) 1992, MindCraft Publ.' 
  172.           DFB $D         ;NEW LINE
  173.           ASC 'Syntax: &P,first,inc,length' 
  174.           DFB $D
  175.           ASC '        &C to Configure' 
  176.           DFB $D,$0 
  177. *
  178. RELOAD    DFB $7         ;BELL
  179.           ASC 'RELOAD YOUR BASIC PROGRAM'
  180.           DFB $D,$0
  181. *
  182. *
  183.           ORG SETUP+$200
  184. *
  185. *ENTRY FOR MAIN PROGRAM
  186. *
  187. START     JSR $FF4A      ;IOSAVE
  188.           JSR $00B7      ;CHRGOT
  189. MODP      BEQ STDFLT     ;OR ISP   
  190.           AND #$5F       ;ENSURE CAPITALS
  191.           CMP #$43       ;C 
  192.           BNE ISP
  193.           JSR $00B1      ;CHRGET
  194. CONJMP    JMP CONFIG
  195. ISP       CMP #$50       ;P
  196. MODCHN    BNE OAALT      ;OR ERR
  197.           JSR $00B1      ;CHRGET
  198. STDFLT    JSR PARSE      ;GET MORE
  199.           STY TLN        ;FIRST   
  200.           STX TLN+1      ;LINE 
  201.           JSR PARSE      ;NEXT ONE 
  202.           PHP            ;SAVE STATUS
  203.           STY INC
  204.           TXA            ;ARE
  205.           STA INC+1      ;BOTH 
  206.           ORA INC        ;ZERO? 
  207.           BNE NOT0       ;IF SO   
  208.           INC INC        ;MAKE IT 1
  209. NOT0      LDX #238       ;DEFAULT LENGTH
  210.           PLP            ;RETRIEVE STATUS
  211.           BEQ DEFLEN     ;Z-FLG SET=0 OR : 
  212.           JSR $E6F5      ;GETBYTC 
  213. DEFLEN    STX LEN        ;LINE LENGTH 
  214.           BNE ERR
  215.           LDY #1         ;HIGH BYTE
  216.           STY FLAG       ;FOR ONE LINE
  217.           LDA ($67),Y    ;ANY PROGRAM?
  218.           BNE SVPTR      ;TO PROCESS  
  219.           LDA #NOPROG    ;NO 
  220.           LDY STABLE+2   ;TELL 
  221.           JMP $DB3A      ;USER, GIVE UP 
  222. PARSE     JSR $00B7      ;CHRGOT
  223.           BEQ PARSE1     ;0 OR :
  224.           JSR $DEBE      ;CHKCOM
  225. PARSE1    JSR $DA0C      ;LINGET 
  226.           PHP            ;SAVE STATUS
  227.           LDY $50        ;ZERO IF
  228.           LDX $51        ;NO NUMBER
  229.           PLP            ;RETRIEVE STATUS
  230.           RTS            ;AND LEAVE
  231. ERR       JMP $DEC9      ;SNERR
  232. OAALT     JSR $FF3F      ;IOREST
  233. OLDAMP    JMP $300       ;MODIFIED
  234. SVPTR     LDA $B9        ;TXTPTR 
  235.           PHA            ;SAVE 
  236.           LDA $B8        ;POINTERS 
  237.           PHA            ;AND 
  238.           TSX            ;THE 
  239.           STX SVSTACK    ;STACK 
  240.           LDY #3         ;SET 
  241.           LDA #$FF       ;UP 
  242. SM1       STA ($AF),Y    ;MARKERS 
  243.           DEY            ;NEXT ONE 
  244.           BPL SM1        ;DONE? 
  245.           INY            ;Y=0 
  246.           STY $C1        ;FIX CHRGET
  247. *
  248. *FIRST PASS CHECK VARIABLES, SPACES, SEMI-COLONS, LINE NOS. 
  249. *
  250.           JSR SETPTRS    ;SET UP 
  251. FP1       LDX #3         ;COUNTER 
  252. FP2       LDY #0         ;DEFAULT FOR FLAG 
  253.           JSR $00B1      ;CHRGET MODIFIED 
  254.           BEQ DOFLG      ;CLEAR FLAG 
  255. CHKTOK    CMP #$BA       ;PRINT
  256.           BNE ISITREM    ;LEAVE FLAG 
  257.           TAY            ;FOR FLAG 
  258. DOFLG     STY PRTFLG
  259. ISITREM   CMP #$B2       ;REM
  260.           BEQ BNXLN      ;SKIP REM 
  261.           CMP #$83       ;DATA
  262.           BEQ TOEOS      ;SKIP DATA  
  263.           TAY            ;TOKEN?
  264.           BPL FP5        ;- IS TOKEN
  265.           LDX #6         ;6 TOKENS 
  266. FP3       DEX            ;NEXT ONE 
  267.           BMI FP1        ;ALL DONE? 
  268.           CMP TOKEN,X    ;SAME? 
  269.           BNE FP3        ;NO, NEXT 
  270. HEXSTR    JSR PACKSTR    ;STRING TO HEX 
  271.           LDA FLAG       ;FOUND NUMBER? 
  272.           BEQ EXISTS     ;NO, FORGET IT 
  273.           INX            ;NEW NUMBER? 
  274.           BNE EXISTS     ;NO, ITS THERE 
  275.           LDA LINNUM+1   ;YES, GET HEX VALUE 
  276.           STA (LPTR),Y   ;INTO BUFFER 
  277.           DEY            ;LOW 
  278.           LDA LINNUM     ;BYTE 
  279.           STA (LPTR),Y   ;TOO 
  280.           JSR ADLPTR     ;SET 
  281.           LDA #$FF       ;UP 
  282.           LDY #5         ;SOME 
  283. FP4       STA (LPTR),Y   ;MORE 
  284.           DEY            ;MARKERS 
  285.           BPL FP4        ;DONE? 
  286. EXISTS    JSR CKCMIN     ;ANOTHER STRING? 
  287.           BEQ HEXSTR     ;YES, CHECK IT 
  288.           TAX            ;ZERO? 
  289.           BMI CHKTOK     ;TOKEN? 
  290. BFP1      BNE FP1        ;MOVE ON 
  291. BFP2      BNE FP2        ;LONG BRANCH
  292. TOEOS     JSR $D995      ;DATA
  293. FP5       JSR $00B7      ;CHRGOT MOD
  294.           BCS MODSC      ;NUMBER? 
  295.           CPX #3         ;PART OF VAR? 
  296.           BCC CHKVAR     ;YES CHECK IT 
  297. MODSC     CMP #$3B       ;SEMI-COLON
  298.           BNE ISPACE 
  299.           LDY PRTFLG     ;IN PRINT? 
  300.           BEQ FP1        ;NO, NEXT 
  301.           LDY #1         ;FOR
  302.           LDA ($B8),Y    ;NEXT CHAR 
  303.           JSR $E07D      ;ISLETC
  304.           BCS CHKX       ;LETTER?
  305.           JSR $00BA      ;NUMBER?
  306.           BEQ FP1        ;LEAVE IF 0 OR :
  307.           BCS FP7        ;ALPHANUMERIC? 
  308. CHKX      CPX #3         ;AFTER  
  309.           BEQ FP7        ;REAL VAR? 
  310.           BNE FP1        ;YES, GO BACK
  311. ISPACE    CMP #$20       ;SPACE
  312.           BEQ FP7        ;YES, REMOVE 
  313.           CMP #$22       ;QUOTE? 
  314.           BNE ISVAR      ;NO, SKIP 
  315. FP6       JSR $00B1      ;YES, NEXT CHAR 
  316.           TAY            ;ZERO? 
  317.           BEQ NXLN       ;YES, EOL
  318.           CMP #$22       ;ANOTHER QUOTE? 
  319.           BNE FP6        ;NO, KEEP LOOKING 
  320. ISVAR     JSR $E07D      ;ISLETC
  321.           TAY            ;ZERO? 
  322. BNXLN     BEQ NXLN       ;YES, EOL
  323.           BCC BFP1       ;LETTER? 
  324. CHKVAR    DEX            ;DROP COUNT 
  325. MODVAR    BNE BFP2       ;>2 CHARS? 
  326.           DFB $24        ;BIT ZPAGE 
  327. FP7       DEX            ;FOR SPACE OR ;
  328.           LDA #$AA
  329.           LDY #0         ;FOR POINTER 
  330.           STA ($B8),Y    ;TO BE REMOVED 
  331.           DFB $2C        ;BIT ABS
  332. ALTVAR    LDX #1         ;KEEP VARIABLE
  333.           INX            ;BUMP UP
  334.           BNE BFP2       ;ALWAYS 
  335. NXLN      JSR CKEOP      ;FINISHED 
  336.           BNE BFP1       ;NO, GO BACK 
  337. *
  338. *RENUMBER THE LINES
  339. *
  340.           JSR SETPTRS    ;SET UP 
  341.           JSR $FC58      ;HOME 
  342. SAMELIN   INC FLAG       ;=1 OR 2 
  343. SAMELN1   JSR SUBLOP     ;SET BUFFER 
  344.           JSR ADDPTR     ;AND
  345. P1        JSR ADLPTR     ;POINTERS 
  346.           LDY #3         ;POINT TO LINE NO. 
  347.           LDA (LPTR),Y   ;AND BUFFER 
  348.           CMP #$FF       ;MARKER? 
  349.           BEQ NTFOUND    ;YES, NOT THERE 
  350.           CMP (PPTR),Y   ;SAME AS LINE NO? 
  351.           BNE P1         ;NO, NEXT 
  352.           DEY            ;CHECK 
  353.           LDA (LPTR),Y   ;LOW 
  354.           CMP (PPTR),Y   ;BYTE 
  355.           BNE P1         ;TOO 
  356.           INC FLAG       ;SET FLAG
  357.           LDY #5         ;AND 
  358.           LDA TLN+1      ;STORE 
  359.           STA (LPTR),Y   ;NEW
  360.           DEY            ;NUMBER 
  361.           LDA TLN        ;IN  
  362.           STA (LPTR),Y   ;BUFFER 
  363. NTFOUND   LDX #$AA       ;LET=REMOVE
  364.           LDY #1         ;FIRST
  365. LDBYTE    LDA ($B8),Y    ;BYTE   
  366.           BNE CKCOLON    ;NO EMPTY LINES 
  367.           DEY            ;REPLACE 
  368.           LDA #$B2       ;SINGLE COLON 
  369.           STA ($B8),Y    ;WITH REM 
  370. CKCOLON   CMP #$3A       ;COLON?
  371.           BNE CKFLG 
  372.           TXA            ;REPLACE 
  373.           STA ($B8),Y    ;WITH 
  374.           INY            ;LET 
  375.           BNE LDBYTE     ;ALWAYS  
  376. CKFLG     LDA FLAG       ;NEED NEW LINE? 
  377.           BNE PRINTNO    ;YES, PRINT IT 
  378.           LDA #$3A       ;INV :
  379.           JSR $FDED      ;PRINT IT
  380.           LDA #$FF       ;MARKER
  381.           INC COMFLG     ;FOR 
  382.           BPL STPP       ;COMBINATION 
  383. PRINTNO   JSR PRTLIN     ;ALSO FIX FLAGS 
  384. STPP      LDY #3         ;OFFSET 
  385.           STA (PPTR),Y   ;STORE HIGH 
  386.           DEY            ;AND 
  387.           TXA            ;LOW BYTE 
  388.           STA (PPTR),Y   ;IN PROGRAM 
  389. NXCH      JSR UNPACK     ;ANALYSE BYTE 
  390.           BEQ ENDLN      ;0=NEW LINE 
  391.           BPL NOTTOK     ;TOKEN? 
  392.           JSR MODREM     ;REM? 
  393.           BEQ ENDLN      ;SKIP THE REST 
  394.           CMP #$AA       ;LET? 
  395.           BEQ NXCH       ;SKIP THAT TOO 
  396.           CMP #$B4       ;ON
  397.           BNE MODNLD
  398. CKON1     JSR MODPRT     ;PRINT THE VERB 
  399. CKON2     JSR UNPACK     ;NEXT BYTE 
  400.           BEQ ENDLN      ;0=EOL 
  401.           BMI CKON1      ;TOKEN? 
  402.           LDY QFLG       ;IN QUOTE?
  403.           BNE CKON3      ;YES, SKIP
  404.           CMP #$3A       ;COLON :
  405.           BEQ NOTTOK     ;END OF ON 
  406. CKON3     JSR LST        ;PRINT IT
  407.           BNE CKON2      ;ALWAYS 
  408. NOTTOK    JSR LST        ;PRINT IT 
  409.           BNE NXCH       ;ALWAYS 
  410. MODNLD    LDX #12        ;12 OR 13 TOKENS 
  411. NXX       DEX            ;NEXT TOKEN 
  412.           BMI NOTFLG     ;NOT FOUND? 
  413.           CMP TOKEN2,X   ;MATCHES? 
  414.           BNE NXX        ;NO, NEXT 
  415.           INC FLAG       ;FOUND ONE 
  416. NOTFLG    JSR MODPRT     ;PRINT AND COUNT 
  417.           BNE NXCH       ;ALWAYS  
  418. ENDLN     LDX LEN        ;CHECK LENGTH 
  419.           CPX COUNT      ;MORE THAN COUNT? 
  420.           BCS CNTOK      ;NO, ITS OK 
  421. SLJMP     LDA COMFLG     ;ONE LINE ONLY 
  422.           BNE SL1        ;NO, A COMBINATION   
  423.           JSR CKEOP      ;LAST LINE 
  424.           BEQ CTP        ;YES, LEAVE 
  425. SL1       JMP SAMELIN    ;KEEP THE LINE 
  426. CNTOK     JSR CKEOP      ;LAST ONE? 
  427.           BEQ CTP        ;MAYBE 
  428.           INC COUNT      ;BUMP, NEVER ZERO 
  429.           JMP SAMELN1    ;COMBINE? 
  430. *
  431. *COMPRESS OR UNPACK THE PROGRAM
  432. *
  433. CTP       LDY #$FF       ;FIND 
  434.           STY LINNUM     ;END
  435.           JSR CKBUF      ;OF
  436.           LDY LPTR+1     ;BUFFER 
  437.           INY            ;NEXT 
  438.           STY HSTORE     ;PAGE 
  439.           STY NPRG+1     ;FOR 
  440.           LDA $67        ;NEW 
  441.           STA NPRG       ;PROGRAM 
  442.           JSR SETPTRS    ;SET UP 
  443.           LDY #3         ;RETRIEVE 
  444.           LDA (PPTR),Y   ;NUMBER 
  445.           STA (NPRG),Y   ;AND 
  446.           STA TLN+1      ;MOVE 
  447.           DEY            ;TO 
  448.           LDA (PPTR),Y   ;THE 
  449.           STA (NPRG),Y   ;BUFFER 
  450.           STA TLN
  451.           JSR COMP       ;COMPRESS OR UNPACK 
  452. RSTPTR    PLA            ;RESTORE 
  453.           STA $B8        ;THE 
  454.           PLA            ;STACKED 
  455.           STA $B9        ;POINTERS 
  456.           LDA #$EF       ;RESTORE  
  457.           STA $C1        ;CHRGET
  458.           JMP $D66C      ;CLEAR MEMORY AND LEAVE 
  459. *
  460. *COPY BYTES TO BUFFER
  461. *
  462. NOTEOP    LDY NPRG+1     ;HIT
  463.           JSR CKMEM      ;HIMEM:?
  464.           LDY #3         ;POINT TO LINE NO. 
  465.           LDA (PPTR),Y   ;HIGH BYTE 
  466.           TAX            ;SAVE IT
  467.           LDY YSTORE     ;JUST IN CASE 
  468.           LDA #$3A       ;DEFAULT
  469.           STA (NPRG),Y   ;IN PROGRAM
  470.           INX            ;WAS X=FF? 
  471.           BEQ CN2        ;YES, LEAVE 
  472. CN0       LDA #0         ;CLEAR
  473.           STA DATAFLG    ;FLAG
  474. CN1       JSR ADDINC     ;NEXT NUMBER 
  475.           JSR FEL        ;FIX END OF LINE 
  476.           BCS CN3        ;TOO LONG?
  477.           INY
  478.           LDA TLN        ;STORE 
  479.           STA (NPRG),Y   ;THE 
  480.           INY            ;LINE 
  481.           LDA TLN+1      ;NUMBERS 
  482.           STA (NPRG),Y  
  483.           LDA DATAFLG    ;SET MEANS
  484.           BEQ COMP       ;IN DATA 
  485.           LDY #4         ;FIRST TOKEN 
  486.           STA (NPRG),Y   ;IS DATA 
  487.           DFB $2C        ;BIT ABS, SKIP 2 BYTES 
  488. COMP      LDY #3         ;ENTRY POINT 
  489. CN2       INY            ;BUMP 
  490.           BNE LDPP       ;OK, MOVE ON 
  491. CN3       JSR TOOLONG
  492.           BNE LINEND2    ;END THIS LINE 
  493. NEBR      BNE NOTEOP     ;LONG HOP
  494. LDPP      JSR $00B1      ;NEXT BYTE 
  495. STNP      JSR ISQT       ;QUOTE OR ZERO? 
  496.           BEQ LINEND     ;YES, EOL 
  497.           STA (NPRG),Y   ;NO, STORE 
  498.           BPL CN2        ;TOKEN? 
  499. ISMARK    CMP #$F8       ;MARKER?
  500.           BEQ CN1        ;YES, NEW LINE 
  501.           CMP #$F9       ;END OF DATA?
  502.           BEQ CN0        ;YES, NEW LINE
  503.           JSR MODREM     ;REM?
  504.           BEQ LECKY      ;REMOVE IT 
  505.           CMP #$AA       ;LET
  506.           BEQ LDPP       ;SUPERFLUOUS 
  507.           CMP #$83       ;DATA 
  508.           BNE CLRDF      ;NO,CLEAR  FLAG 
  509.           LDX DATAFLG    ;FLAG SET 
  510. MODPD     BEQ SETDF      ;NO, SET IT 
  511.           DEY            ;YES, REPLACE
  512.           LDA #$2C       ;COLON WITH COMMA 
  513.           BNE STNP       ;ALWAYS
  514. CLRDF     LDX #0         ;CLEAR FALLS THROUGH 
  515.           DFB $24        ;BIT ZP
  516. SETDF     TAX            ;TOKEN TO XREG  
  517.           STX DATAFLG    ;$83 OR 0 
  518.           LDX #6         ;6 TOKENS 
  519. CT3       DEX            ;NEXT 
  520.           BMI CN2        ;NOT FOUND? 
  521.           CMP TOKEN,X    ;SAME? 
  522.           BNE CT3        ;NO, NEXT 
  523. STRFND    INY            ;FOUND ONE 
  524.           BEQ CN3        ;TOO LONG 
  525.           STY YSTORE     ;SAVE IT 
  526.           JSR PACKSTR    ;STRING TO HEX 
  527.           LDA FLAG       ;FOUND STRING? 
  528.           BEQ NONUM      ;NO, FORGET IT 
  529.           JSR YESNUM     ;REPLACE WITH NEW STRING 
  530. NONUM     JSR CKCMIN     ;ANOTHER STRING? 
  531.           STA (NPRG),Y   ;STORE ,-0: OR TOKEN 
  532.           BEQ STRFND     ;FOUND ANOTHER 
  533.           TAX            ;NO, ZERO? 
  534.           BMI ISMARK     ;TOKEN? 
  535.           BNE CN2        ;MOVE ON? 
  536.           BPL LINEND     ;ZERO FOUND
  537. LECKY     CPY #4         ;CHECK Y 
  538.           BEQ LINEND     ;NEW LINE
  539.           DEY            ;ITS OK
  540. LINEND    LDA QFLG       ;QUOTE CLOSED? 
  541.           BEQ LINEND2    ;NO, CLOSE IT 
  542.           STA (NPRG),Y   ;A=$22 
  543.           INY
  544.           BEQ CN3        ;TOO LONG 
  545. LINEND2   STY YSTORE     ;NO, SAVE Y 
  546.           JSR CKEOP      ;LAST LINE? 
  547.           BNE NEBR       ;LONG HOP BACK 
  548.           LDY YSTORE     ;RETRIEVE YREG
  549.           JSR FEL        ;END OF LINE    
  550.           BCS CN3        ;TOO LONG?
  551.           LDA NPRG       ;MOVE 
  552.           STA $42        ;ZEROS 
  553.           LDA NPRG+1     ;AND 
  554.           STA $43        ;MACHINE 
  555.           LDA $B8        ;LANGUAGE 
  556.           STA $3C        ;IF  
  557.           LDA $B9        ;ANY  
  558.           STA $3D        ;TO
  559.           SEC
  560.           LDA $AF        ;NEW 
  561.           STA $3E        ;PROGRAM 
  562.           SBC $B8
  563.           TAX
  564.           LDA $B0
  565.           STA $3F 
  566.           SBC $B9
  567.           TAY
  568.           CLC
  569.           TXA
  570.           ADC NPRG
  571.           TAX
  572.           TYA
  573.           ADC NPRG+1
  574.           CMP $74
  575.           BCC ISOK
  576.           JMP OOMEM
  577. ISOK      PHA
  578.           LDY #0
  579.           JSR $FE2C      ;MOVE 
  580.           TXA            ;NOW 
  581.           STA $3E        ;MOVE 
  582.           PLA            ;IT 
  583.           STA $3F        ;ALL 
  584.           LDA HSTORE     ;BACK 
  585.           STA $3D        ;AGAIN 
  586.           LDA $67 
  587.           STA $3C 
  588.           STA $42 
  589.           LDA $68
  590.           STA $43    
  591.           JSR $FE2C      ;MOVE 
  592.           JSR $FD8E      ;CROUT
  593.           DEC $42        ;ADJUST
  594.           BNE NODEC      ;THE
  595.           DEC $43        ;POINTER
  596. NODEC     SEC            ;READY TO SUBTRACT
  597.           LDA $42        ;SET 
  598.           STA $AF        ;OF PROGRAM 
  599.           STA $69        ;AND LOMEM 
  600.           SBC $67        ;- LO BYTE OF START
  601.           TAX            ;FOR LINPRT 
  602.           LDA $43        ;HIGH 
  603.           STA $B0        ;BYTE 
  604.           STA $6A        ;TOO 
  605.           SBC $68
  606.           JSR $ED24      ;LINPRT 
  607.           LDA #BYTES     ;LO BYTE 
  608.           LDY STABLE+2   ;HI BYTE 
  609.           JMP $DB3A      ;STROUT
  610. *
  611. *SUBROUTINES
  612. *
  613. *CHECK FOR END OF PROGRAM
  614. *
  615. CKEOP     LDY #0         ;GET
  616.           LDA (PPTR),Y   ;POINTERS 
  617.           TAX            ;AND 
  618.           INY            ;SAVE 
  619.           LDA (PPTR),Y   ;THEM 
  620.           STX PPTR       ;IN 
  621.           STA PPTR+1     ;BOTH
  622.           STX $B8        ;POINTERS 
  623.           STA $B9
  624.           LDA (PPTR),Y   ;ZERO?
  625.           BEQ EXEOP      ;0=END OF PROGRAM
  626.           STA $B9        ;IS 
  627.           DEY            ;IT 
  628.           LDA (PPTR),Y   ;THE
  629.           STA $B8        ;LAST 
  630.           INY            ;LINE? 
  631.           LDA ($B8),Y    ;ZERO?
  632.           BNE ADDPTR     ;0=LAST LINE
  633. ADDPTR    CLC            ;NOW 
  634.           LDA PPTR       ;MOVE 
  635.           ADC #3         ;UP 
  636.           STA $B8        ;FIRST 
  637.           LDA #0         ;BYTE  
  638.           STA REMFLG     ;CLEAR 
  639.           STA COMFLG     ;SOME
  640.           STA QFLG       ;FLAGS 
  641.           ADC PPTR+1     ;HIGH
  642.           STA $B9        ;BYTE 
  643. EXEOP     RTS            ;RETURN 
  644. *
  645. *SET POINTERS TO START OF PROGRAM
  646. *
  647. SETPTRS   LDA $67        ;TXTTAB   
  648.           STA PPTR       ;THREE 
  649.           LDA $68        ;POINTERS 
  650.           STA PPTR+1     ;TO SET 
  651.           STA LSTORE     ;FOR NEW PROGRAM 
  652.           BNE ADDPTR     ;ALWAYS  
  653. *
  654. *INIT POINTER TO BUFFER
  655. *
  656. SUBLOP    SEC            ;READY 
  657.           LDA $AF        ;VARTAB 
  658.           SBC #6         ;ALIGN 
  659.           STA LPTR       ;BUFFER 
  660.           LDA $B0        ;AND 
  661.           SBC #0         ;PROGRAM 
  662.           STA LPTR+1     ;POINTERS 
  663.           RTS
  664. *
  665. *CONVERT STRING TO HEX AT $50,$51 
  666. *
  667. PACKSTR   LDA #0         ;CLEAR 
  668.           STA FLAG       ;FLAG 
  669. PS1       JSR $00B1      ;GET BYTE 
  670.           BCC PS2        ;NUMBER? 
  671.           CMP #$AA       ;LET
  672.           BEQ PS1        ;YES, KEEP LOOKING 
  673. EXPS      RTS            ;NO, LEAVE
  674. PS2       INC FLAG       ;FOUND NO. 
  675.           JSR $DA0C      ;LINGET 
  676. CKBUF     JSR SUBLOP     ;START OF
  677. CB1       JSR ADLPTR     ;BUFFER 
  678.           LDY #3         ;ORIGINAL 
  679.           LDA (LPTR),Y   ;NUMBER 
  680.           TAX            ;SAVE 
  681.           CMP #$FF       ;MARKER? 
  682.           BEQ EXPS       ;NOT FOUND 
  683.           CMP LINNUM+1   ;SAME? 
  684.           BNE CB1        ;NO, NEXT 
  685.           DEY            ;CHECK 
  686.           LDA (LPTR),Y   ;LOW 
  687.           CMP LINNUM     ;BYTE 
  688.           BNE CB1        ;TOO 
  689.           RTS            ;FOUND IT
  690. *FIND TOKEN, PRINT AND COUNT 
  691. *
  692. MODPRT    CMP #$BA       ;PRINT
  693.           BEQ LDQM       ;USE ? 
  694.           SEC            ;READY 
  695.           SBC #$7F       ;GET INDEX 
  696.           TAX            ;IN X REG 
  697.           LDY #$D0       ;OFFSET 
  698.           STY $9D        ;TOKENPTR
  699.           DEY
  700.           STY $9E        ;TOKENPTR 
  701.           LDY #$FF       ;INITIALISE Y REG 
  702. TOK1      DEX            ;NEXT TOKEN 
  703.           BEQ TOK2       ;FOUND TOK
  704. TOK       JSR $D72C      ;NXTOK
  705.           BPL TOK        ;MORE IN THIS ONE? 
  706.           BMI TOK1       ;LAST CHAR IS MINUS 
  707. TOK2      JSR $D72C      ;FOR OUR TOKEN 
  708.           BMI LST        ;END OF TOKEN? 
  709.           ORA #$80       ;SCREEN FORMAT 
  710. MODLST    LDX #8         ;OR INC COUNT ($8) 
  711.           BEQ EXLST      ;TOO BIG? 
  712.           JSR $DB64      ;PRTWT 
  713.           BNE TOK2       ;ALWAYS 
  714. LDQM      LDA #$3F       ;?
  715. LST       INC COUNT      ;LAST CHAR 
  716.           BEQ EXLST      ;TOO LONG? 
  717.           CMP #$1F       ;CONTROL? 
  718.           BCS NTCTRL     ;MASK
  719.           ORA #$40       ;FLASH OR INV
  720.           DFB $2C        ;BIT ABS
  721. NTCTRL    ORA #$80       ;NORMAL
  722.           JMP $DB64      ;PRTWT Z=0
  723. EXLST     PLA            ;FIX
  724.           PLA  STACK
  725.           JMP SLJMP      ;TOO LONG
  726. *
  727. *CONVERT HEX TO STRING AT $100
  728. *
  729. YESNUM    LDY #5         ;POINT 
  730.           LDA (LPTR),Y   ;TO NEW NUMBER 
  731.           CMP #$FF       ;MARKER? 
  732.           BNE REFOK      ;NO, ALL IS WELL 
  733.           LDA #$F2       ;UNDEF STMENT
  734.           JSR DOERR      ;PRINT ERROR MSG 
  735.           LDY LINNUM     ;CHANGE 
  736.           LDA LINNUM+1   ;OLD HEX 
  737.           JMP PROCESS    ;TO STRING 
  738. REFOK     TAX            ;SAVE 
  739.           DEY
  740.           LDA (LPTR),Y   ;LOW BYTE 
  741.           TAY            ;TO Y REG 
  742.           TXA            ;HIGH IN A REG 
  743. PROCESS   JSR $E2F2      ;GIVAYF 
  744.           JSR $ED34      ;FOUT 
  745.           LDY YSTORE     ;CURRENT POSITION 
  746.           LDX #0         ;FOR FIRST ONE 
  747. PR2       LDA $100,X     ;GET BYTE 
  748.           BEQ EXYN       ;0=FINISHED 
  749.           STA (NPRG),Y   ;STORE 
  750.           INY            ;BUMP 
  751.           BNE PR3        ;USUALLY 
  752.           PLA            ;FIX 
  753.           PLA            ;STACK 
  754.           JMP CN3        ;TOO LONG  
  755. PR3       INX            ;BUMP 
  756.           BNE PR2        ;ALWAYS  
  757. EXYN      STY YSTORE     ;SAVE IT 
  758.           RTS            ;AND LEAVE
  759. *
  760. *OUTPUT THE LINE
  761. *
  762. LINDO     JSR $FD8E      ;CROUT 
  763.           LDX TLN        ;PRINT 
  764.           LDA TLN+1      ;THE 
  765.           JSR $ED24      ;NUMBER 
  766.           LDX $24        ;SAVE 
  767.           STX COUNT      ;ITS 
  768.           RTS            ;LENGTH 
  769. *
  770. *PRINT LINE NO. AND SAVE LENGTH
  771. *
  772. PRTLIN    JSR LINDO
  773. MODUPL    LDA #0         ;1=DONT UNPACK
  774.           STA IFFLG
  775. MODPL     LDA #0         ;1 = NEW LINE 
  776.           STA FLAG
  777.           LDX TLN        ;RETRIEVE 
  778.           LDA TLN+1      ;NUMBER 
  779. ADDINC    PHA            ;SAVE A REG
  780. AI1       CLC            ;CALCULATE 
  781.           LDA TLN        ;NEXT 
  782.           ADC INC        ;LINE 
  783.           STA TLN        ;NUMBER 
  784.           LDA TLN+1      ;AND 
  785.           ADC INC+1      ;HIGH
  786.           STA TLN+1      ;BYTE 
  787.           BCS AI2        ;TOO
  788.           CMP #$FA       ;BIG?
  789.           BLT EXAI
  790. AI2       LDA #$EF       ;ILLEGAL QUANTITY
  791.           JSR DOERR      ;PRINT MSG
  792.           JMP OM1        ;AND QUIT
  793. EXAI      PLA            ;A-REG 
  794.           RTS            ;RETURN 
  795. *
  796. *FIX END OF LINE
  797. *
  798. FEL       LDA #$3A       ;COLON
  799.           STA (NPRG),Y   ;FOR DEFAULT
  800.           TYA            ;NEAR
  801.           CLC            ;255?
  802.           ADC #7
  803.           BCS FEL3       ;CLEAR=OK
  804.           CPY #4         ;EMPTY 
  805.           BNE FEL2       ;LINE? 
  806.           INY
  807. FEL2      LDA #0
  808.           STA (NPRG),Y   ;0=EOL 
  809.           INY
  810.           STY YSTORE     ;SAVE YREG 
  811. *
  812. *PUT POINTER AT THE START OF A LINE
  813. *
  814.           LDY #0         ;FIRST BYTE 
  815.           CLC            ;READY TO ADD 
  816.           LDA NPRG       ;POSITION 
  817.           ADC YSTORE     ;TO  
  818.           STA (NPRG),Y   ;OFFSET 
  819.           PHP            ;SAVE STATUS 
  820.           TAX            ;AND LOCATION 
  821.           LDA LSTORE     ;ACTUAL ADDRESS 
  822.           ADC #0         ;IN 
  823.           STA LSTORE     ;LOW MEMORY 
  824.           INY            ;HIGH  
  825.           STA (NPRG),Y   ;BYTE 
  826.           PLP            ;RESTORE STATUS 
  827.           BCC SKIP       ;WAS CARRY CLEAR? 
  828.           INC NPRG+1     ;NO, BUMP 
  829. SKIP      STX NPRG       ;NEW ADDRESS
  830.           LDX NPRG+1     ;MEMORY 
  831.           INX            ;STILL 
  832.           CPX $74        ;OK? 
  833.           BGE OOMEM 
  834. *
  835. *CHECK FOR REM
  836. *
  837. MODREM    CMP #$B2       ;REM (MOD LDX #1)
  838.           CLC
  839. FEL3      RTS
  840. *
  841. *MOVE TO NEXT NUMBER IN BUFFER
  842. *
  843. ADLPTR    CLC            ;MOVE 
  844.           LDA LPTR       ;UP 
  845.           ADC #4         ;TO 
  846.           STA LPTR       ;NEXT 
  847.           BCC EXIT       ;LINE 
  848.           INC LPTR+1     ;NUMBER 
  849.           LDY LPTR+1     ;AND 
  850. CKMEM     INY            ;CHECK 
  851.           CPY $74        ;HIMEM
  852.           BGE OOMEM 
  853. EXIT      RTS
  854. *
  855. *HANDLE OUT OF MEMORY
  856. *
  857. OOMEM     JSR $FD8E      ;CROUT
  858.           LDA #$F1       ;OUT OF MEMORY 
  859.           JSR DE1
  860. OM1       LDX SVSTACK    ;CLEAR 
  861.           TXS            ;STACK 
  862.           JMP RSTPTR     ;AND LEAVE 
  863. *
  864. *CHECK COMMA AND DASH (MINUS)
  865. *
  866. CKCMIN    JSR $00B7      ;RETRIEVE BYTE 
  867.           LDY YSTORE     ;READY TO STORE BYTE 
  868.           CMP #$2C       ;COMMA
  869.           BEQ EXCK       ;ANOTHER STRING FOLLOWS 
  870.           CMP #$C9       ;DASH
  871. EXCK      RTS            ;ZFLAG IS CORRECT 
  872. *
  873. *PRINT LENGTH ERROR MESSAGE
  874. *
  875. TOOLONG   LDA #$F8       ;LINE TOO LONG 
  876. DOERR     PHA            ;STORE CODE 
  877.           JSR LINDO      ;PRINT LINE NO 
  878.           LDA #$A0       ;SPACE 
  879.           JSR $FDED      ;COUT
  880.           PLA            ;ERROR TOKEN 
  881. DE1       JSR MODPRT     ;PRINT IT 
  882.           JSR $FF3A      ;BELL 
  883.           LDY #5         ;CORRECT LENGTH 
  884.           RTS            ;AND RETURN 
  885. *
  886. *CHECK FOR A NEW LINE
  887. *
  888. UNPACK    JSR $00B1  
  889.           PHA            ;SAVE 
  890.           LDX #$F8       ;LINE TOO LONG
  891.           LDY REMFLG     ;IN REM?
  892.           BNE BEXUP      ;SKIP THE REST. 
  893.           LDY QFLG       ;IN QUOTE? 
  894.           BNE AREM       ;YES, SKIP
  895.           LDY DATAFLG    ;IN DATA? 
  896.           BEQ COLON1     ;SKIP COMMA
  897. MODUPD    CMP #$2C       ;COMMA?
  898.           BEQ LDIFLG
  899. COLON1    CMP #$3A       ;COLON :
  900.           BNE AREM       ;NO, CHECK IT 
  901.           LDY #1
  902.           LDA ($B8),Y    ;NEXT BYTE 
  903.           BNE ISCOLON    ;0=COLON AT EOL 
  904. REMOVE    LDY #0         ;SPURIOUS BYTE  
  905.           LDA #$AA       ;LET=REMOVE
  906.           STA ($B8),Y    ;FIRST ONE  
  907.           PLA            ;FIX STACK
  908.           BNE UNPACK     ;ANY MORE? 
  909. ISCOLON   CMP #$3A       ;ANOTHER COLON? 
  910.           BEQ REMOVE     ;YES, REMOVE 
  911.           LDY DATAFLG    ;END OF DATA? 
  912.           BEQ LDIFLG     ;NO, USE $F8 
  913.           INX            ;USE $F9
  914. LDIFLG    LDY IFFLG      ;IF? 
  915. BEXUP     BNE EXUP       ;YES, DONT UNPACK 
  916.           LDY COUNT
  917.           CPY LEN        ;BIGGER? 
  918.           BCC EXUP       ;NO, LEAVE 
  919.           LDY #0         ;YES 
  920.           STY COUNT      ;RESET COUNT
  921.           TXA            ;$F8 OR $F9
  922.           STA ($B8),Y    ;REPLACE COLON OR COMMA 
  923.           JMP AI1        ;NEW NUMBER 
  924. AREM      CMP #$B2       ;REM?
  925.           BNE ISITDAT 
  926.           STA REMFLG
  927. ISITDAT   CMP #$83       ;DATA
  928.           BEQ ISDATA
  929.           CMP #$AD       ;IF? 
  930.           BNE ISTHEN  
  931.           INC IFFLG      ;SET FLAG 
  932. ISTHEN    CMP #$C4       ;THEN
  933.           BNE CHKPL      ;CHECK
  934.           LDY #0         ;FOR
  935. IT1       INY            ;SUPERFLUOUS 
  936.           LDA ($B8),Y    ;TOKENS 
  937.           CMP #$AA       ;LET?
  938.           BEQ IT1        ;YES, IGNORE
  939.           CMP #$AB       ;GOTO
  940.           BEQ REMOVE     ;IS SUPERFLUOUS 
  941. CHKPL     PLA            ;RETRIEVE 
  942.           BPL ISQT 
  943.           CMP #$AA       ;LET
  944.           BEQ ISQT       ;YES; IGNORE
  945.           LDY #0         ;CLEAR FLAG 
  946.           STY DATAFLG
  947. ISQT      PHA            ;ENTRY FOR COMPACT
  948.           CMP #$22       ;QUOTE 
  949.           BNE EXUP  
  950.           EOR QFLG       ;TOGGLE 
  951.           STA QFLG       ;FLAG 
  952. EXUP      PLA            ;RETRIEVE A REG 
  953.           RTS            ;LEAVE 
  954. *
  955. *DEAL WITH DATA STATEMENTS
  956. *
  957. ISDATA    STA DATAFLG    ;A=$83
  958.           LDY #0         ;INITIALISE Y-REG 
  959. FRONT     LDX #$AA       ;LET=REMOVE
  960. DT1       INY            ;REMOVE 
  961.           LDA ($B8),Y    ;LEADING 
  962.           CMP #$20       ;SPACE
  963.           BNE REST       ;MORE SPACES? 
  964.           TXA            ;REPACE 
  965.           STA ($B8),Y    ;WITH 
  966.           BNE DT1        ;LET 
  967. TOCOM     CMP #$2C       ;COMMA
  968.           BEQ FRONT      ;MORE DATA? 
  969.           CMP #$3A       ;COLON
  970.           BEQ EOSTMT     ;NO, LEAVE 
  971.           TAX            ;ZERO 
  972.           BEQ EXUP       ;MEANS EOL 
  973.           INY            ;SKIP 
  974.           LDA ($B8),Y    ;GOOD 
  975.           BPL TOCOM ,DATA
  976. REST      CMP #$22       ;QUOTE
  977.           BNE TOCOM      ;SKIP REST 
  978. R1        INY            ;SKIP 
  979.           LDA ($B8),Y    ;TO 
  980.           BEQ EXUP       ;NEXT 
  981.           CMP #$22       ;QUOTE
  982.           BNE R1
  983. R2        INY            ;REMOVE 
  984.           LDA ($B8),Y    ;TRAILING 
  985.           CMP #$20       ;SPACES 
  986.           BNE TOCOM      ;AFTER 
  987.           LDA #$AA       ;A
  988.           STA ($B8),Y    ;QUOTE 
  989.           BNE R2         ;ALWAYS 
  990. EOSTMT    INY            ;ANOTHER 
  991.           LDA ($B8),Y    ;DATA
  992.           CMP #$83       ;RELACE 
  993.           BNE EXUP       ;WITH
  994.           LDA #$2C       ;COMMA
  995.           STA ($B8),Y    ;AND THE 
  996.           DEY            ;COLON WITH 
  997.           LDA #$AA       ;LET 
  998.           STA ($B8),Y    ;MOVE 
  999.           INY            ;FORWARD 
  1000.           BNE FRONT      ;ALWAYS 
  1001. *
  1002. *SELECT OPTIONS
  1003. *
  1004. CONFIG    JSR $FC58      ;HOME 
  1005.           LDA #8         ;VTAB9 
  1006.           JSR $FB5B      ;TABV
  1007.           LDY #11        ;12 ROWS 
  1008. DOT       LDX #30        ;31 DOTS 
  1009.           LDA #$AE       ;DOT 
  1010. DOT1      JSR $FDED      ;COUT
  1011.           DEX            ;NEXT DOT 
  1012.           BPL DOT1       ;MORE? 
  1013.           JSR $DAFB      ;CRDO
  1014.           DEY            ;NEXT LINE 
  1015.           BPL DOT        ;MORE? 
  1016.           LDA #6         ;VTAB7:HTAB7 
  1017.           STA $24        ;CH
  1018.           JSR $FB5B      ;TABV 
  1019. *
  1020. *PRINT TEXT
  1021.           LDX #$FF       ;SET INDEX 
  1022. PT1       LDA #$A0       ;SPACE
  1023.           STA CSTORE     ;FOR RDKEY 
  1024. PT2       INX            ;NEXT CHAR 
  1025.           JSR $FDED      ;COUT
  1026.           LDA HEADING,X  ;GET CHAR 
  1027.           BEQ TOGGLE     ;0=FINISHED 
  1028.           CMP #$8D       ;RETURN? 
  1029.           BNE PT2        ;NO, NEXT 
  1030.           JSR $DAFB      ;CRDO
  1031.           BCS PT1        ;ALWAYS
  1032. *
  1033. *PRINT STATUS
  1034. *
  1035. TOGGLE    LDA #8         ;VTAB9  
  1036.           JSR $FB5B      ;TABV
  1037.           LDA #0         ;ZERO 
  1038.           STA COUNT      ;COUNTER 
  1039. ENTRY     JSR XOFFST     ;MULTIPLY 
  1040.           STA STABLE+1
  1041.           LDA #30        ;HTAB31
  1042.           STA $24        ;CH
  1043. STABLE    LDA VALTBL     ;SAME 
  1044.           CMP (LOC),Y    ;AS 
  1045.           BEQ ORIG       ;PROGRAM 
  1046.           INY            ;NO, Y=>1
  1047.           LDX #OFF
  1048.           DFB $2C ,BIT ABS
  1049. ORIG      LDX #ON
  1050.           TYA            ;Y=0 OR 1
  1051.           LDY COUNT      ;POINT TO ARRAY
  1052.           STA STATE,Y    ;STORE STATUS 
  1053.           TXA            ;ON OR OFF
  1054.           LDY STABLE+2   ;HI BYTE
  1055.           JSR $DB3A      ;STROUT 
  1056.           INC COUNT   
  1057.           LDA COUNT      ;FINISHED  
  1058.           CMP #12        ;YET? 
  1059.           BNE ENTRY      ;NO, GO BACK 
  1060. *
  1061. *GET INPUT 
  1062. *
  1063.           LDA #17        ;HTAB18 
  1064.           STA $24        ;CH
  1065.           LDA #21        ;VTAB 22 
  1066.           JSR $FB5B      ;TABV
  1067. E5        LDA CSTORE     ;RETRIEVE CHAR
  1068.           JSR $FDED      ;COUT
  1069.           LDA #$88       ;BACK SPACE 
  1070.           JSR $FDED      ;COUT
  1071.           JSR $FD0C      ;RDKEY 
  1072.           CMP #$9B       ;ESC? 
  1073.           BEQ EXCON      ;YES, LEAVE 
  1074.           CMP #$A0       ;CONTROL  
  1075.           BCS SVCHR      ;CHARACTER? 
  1076.           LDA #$A0       ;USE SPACE
  1077. SVCHR     STA CSTORE     ;SAVE IT
  1078.           AND #$5F       ;UPPER CASE
  1079.           CMP #$41       ;A 
  1080.           BCC E6  
  1081.           CMP #$4D       ;M 
  1082.           BCC ONEFND
  1083. E6        JSR $FF3A      ;BELL  
  1084.           BPL E5         ;ALWAYS 
  1085. ONEFND    SEC 
  1086.           SBC #$41       ;OFFSET 
  1087.           TAX            ;TO 
  1088.           LDA STATE,X    ;STATUS 
  1089.           PHA            ;SAVE IT 
  1090.           TXA            ;X=OFFSET 
  1091.           STA COUNT
  1092.           JSR XOFFST     ;MULTIPLY 
  1093.           STA GETALT+1   ;AND STORE 
  1094.           PLA            ;RETRIEVE STATUS 
  1095.           EOR #1         ;TOGGLE 0<->1 
  1096.           TAX            ;STORE 
  1097. GETALT    LDA VALTBL,X   ;OTHER 
  1098.           STA (LOC),Y    ;VALUE
  1099.           JMP TOGGLE     ;DO IT AGAIN 
  1100. XOFFST    ASL A          ;*2, CLEARS C 
  1101.           PHA            ;SAVE
  1102.           ADC COUNT      ;TRIPLE
  1103.           TAX            ;OFFSET
  1104.           LDA POSTBL+1,X
  1105.           STA LOC        ;LO BYTE
  1106.           INX
  1107.           LDA POSTBL+1,X
  1108.           STA LOC+1      ;HI BYTE
  1109.           PLA            ;=DOUBLE
  1110.           ADC #VALTBL    ;C IS CLEAR
  1111.           LDY #0
  1112. EXCON     RTS
  1113. *
  1114. *RELOCATABLE TABLES
  1115. *
  1116. POSTBL    JMP MODP+1     ;A 
  1117.           JMP MODCHN+1   ;B 
  1118.           JMP MODREM     ;C 
  1119.           JMP MODSC      ;D 
  1120.           JMP MODVAR+1   ;E
  1121.           JMP MODPRT     ;F 
  1122.           JMP MODLST     ;G 
  1123.           JMP MODPD      ;H 
  1124.           JMP MODUPD     ;I 
  1125.           JMP MODNLD+1   ;J 
  1126.           JMP MODPL+1    ;K 
  1127.           JMP MODUPL+1   ;L 
  1128. *
  1129. HEADING   ASC 'CONFIGURE SQUEEZER' 
  1130.           DFB $8D,$8D
  1131. *
  1132. OPTIONS   ASC 'A. Invoke with &' 
  1133.           DFB $8D
  1134.           ASC 'B. Chain' 
  1135.           DFB $8D
  1136.           ASC 'C. Remove REMs' 
  1137.           DFB $8D
  1138.           ASC 'D. Remove semi-colons' 
  1139.           DFB $8D
  1140.           ASC 'E. Shorten variables' 
  1141.           DFB $8D
  1142.           ASC 'F. Use ? for PRINT' 
  1143.           DFB $8D
  1144.           ASC 'G. Use 1 char tokens' 
  1145.           DFB $8D 
  1146.           ASC 'H. Pack DATA' 
  1147.           DFB $8D 
  1148.           ASC 'I. Unpack DATA' 
  1149.           DFB $8D 
  1150.           ASC 'J. Use new lines for DATA' 
  1151.           DFB $8D
  1152.           ASC 'K. Pack lines' 
  1153.           DFB $8D
  1154.           ASC 'L. Unpack lines' 
  1155.           DFB $8D,$8D 
  1156. PROMPT    ASC 'Type A-L or Esc: ' 
  1157.           DFB $0
  1158. *
  1159. VALTBL    DFB $13,$0C    ;A,BRANCH 
  1160.           DFB $4A,$47    ;B,BRANCH 
  1161.           DFB $C9,$A2    ;C,CMP IMM,LDX IMM
  1162.           DFB $C9,$A0    ;D,CMP IMM,LDY IMM 
  1163.           DFB $B7,$09    ;E,BRANCH  
  1164.           DFB $C9,$A2    ;F,CMP IMM,LDX IMM 
  1165.           DFB $A2,$E6    ;G,LDX IMM,INC ZPG 
  1166.           DFB $F0,$B0    ;H,BEQ,BCS
  1167.           DFB $C9,$A0    ;I,CMP IMM,LDY IMM
  1168.           DFB $D,$C      ;J,NO OF TOKENS
  1169.           DFB $0,$1      ;K,FLAG
  1170.           DFB $0,$1      ;L,FLAG
  1171. *
  1172. ON        ASC 'ON ' 
  1173.           DFB $8D,$0
  1174. OFF       ASC 'OFF' 
  1175.           DFB $8D,$0
  1176. *
  1177. BYTES     ASC ' BYTES'
  1178.           DFB $0         ;END OF MSG 
  1179. NOPROG    ASC 'NO PROGRAM'
  1180.           DFB $87,$0     ;BELL, END
  1181. *
  1182. STATE     DFB $0,$0,$0,$0,$0,$0
  1183.           DFB $0,$0,$0,$0,$0,$0
  1184. *
  1185. *6 TOKENS WITH POSSIBLE LINE NO.
  1186. *
  1187. TOKEN     DFB $BC,$C4,$B0 ;LIST,THEN,GOSUB 
  1188. *
  1189. *12 TOKENS WHICH TERMINATE A LINE
  1190. TOKEN2    DFB $85,$AB,$AC ;DEL,GOTO,RUN  
  1191.           DFB $BF,$B6,$B3 ;NEW,LOAD,STOP 
  1192.           DFB $A6,$80,$A5 ;RESUME,END,ONERR 
  1193.           DFB $B2,$B1,$AD ;REM,RETURN,IF 
  1194.           DFB $83        ;DATA, OPTIONAL
  1195. FINISH    EQU *
  1196.